package com.fzn2._01greenhorn.class01;

/**
 * @program: DataStructure
 * 描述：   打印一个数的32位的二进制
 * & 运算    1&1 ==1
 * 0&0 ==0
 * 1&0 ==0
 * @author: fzn
 * @create: 2022-10-19 09:30
 **/
public class Code01_Print {
    public static void main(String[] args) {
        // int是32位表示
        int a = 11;
        print(a);

        // 利用 包装类变二进制
        System.out.println(Integer.toBinaryString(a));
        System.out.println("========右移=========");
        // 右移  带符号右移是拿符号位来补
        int b = -1024;
        print(b);
        print(b >> 1);
        // 不带符号右移  是拿0来补
        print(b >>> 1);
        System.out.println("========取反=========");
        // 一个数的相反数 系统最小除外 是他自己
        // -2147483648
        int x = Integer.MIN_VALUE;
        System.out.println(x);
        x = (~x) + 1;
        System.out.println("系统最小是它本身" + x);
        int c = 5;
        int d = -5;
        d = (~c) + 1;
        print(c);
        print(d);
        System.out.println(d);
    }

    /**
     * 打印一个整数的32位的二进制数
     *
     * @param num int
     */
    private static void print(int num) {
        // 从32位开始 num&这个数 如果为0则num的32不为1 否则为1
        for (int i = 31; i >= 0; i--) {
            System.out.print((num & (1 << i)) == 0 ? "0" : "1");
        }
        System.out.println();
    }

}